package tech.waterism.topo.engine;

import lombok.Builder;
import lombok.Data;
import tech.waterism.topo.model.JointDispatchGroup;
import tech.waterism.topo.model.TopoNode;

import java.util.Date;
import java.util.List;

/**
 * 调度引擎请求
 * 
 * <p>包含调洪演算所需的所有输入数据
 * <p>这是纯核心数据结构，不依赖任何 service 层的 DTO
 * 
 * @author waterism
 * @since 1.0.0
 */
@Data
@Builder
public class EngineRequest {
    
    // ========== 时间参数 ==========
    /** 预报起始时间（起调时间） */
    private Date startTime;
    
    /** 实测起始时间 */
    private Date observationStartTime;
    
    /** 修改时间（用于指定泄流方式的起始时间） */
    private Date modifyTime;
    
    // ========== 拓扑数据 ==========
    /** 拓扑节点列表（按拓扑顺序排列） */
    private List<TopoNode> nodes;
    
    /** 联调组列表 */
    private List<JointDispatchGroup> jointGroups;
    
    // ========== 调度配置 ==========
    /** 调度类型：0=天然出流, 1=当前出流, 3=反算出流, 4=自定义规则 */
    private Integer dispatchType;
    
    /** 出流类型：0=水位反推, 1=指定出流, 2=闸门开度 */
    private Integer outFlowType;
    
    // ========== 扩展接口 ==========
    /** 
     * 调度器接口（用于水库/蓄滞洪区调度）
     * <p>由 service 层实现具体的调度逻辑
     */
    private NodeDispatcher dispatcher;
    
    /** 
     * 统计器接口（用于峰量时统计）
     * <p>由 service 层实现具体的统计逻辑
     */
    private NodeStatistician statistician;
    
    /** 
     * 后处理器接口（用于全局检查和修正）
     * <p>由 service 层实现具体的后处理逻辑
     */
    private PostProcessor postProcessor;
}

